package br.skytef.stmanager.utils;

import java.sql.SQLException;
import java.sql.Timestamp;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.eclipse.persistence.exceptions.SessionLoaderException;

import br.skytef.stmanager.beans.LoginBean;
import br.skytef.stmanager.daos.ClienteDAO;
import br.skytef.stmanager.daos.ComercialClienteDAO;
import br.skytef.stmanager.daos.ComercialDAO;
import br.skytef.stmanager.daos.ControlPlanilhaDAO;
import br.skytef.stmanager.daos.DivergenciaClienteDao;
import br.skytef.stmanager.daos.ErroPlanilhaDAO;
import br.skytef.stmanager.daos.ProdutoClienteDao;
import br.skytef.stmanager.daos.ProdutoDao;
import br.skytef.stmanager.daos.SoftwareHouseDao;
import br.skytef.stmanager.entities.ClienteEntity;
import br.skytef.stmanager.entities.ComercialClienteEntity;
import br.skytef.stmanager.entities.ComercialEntity;
import br.skytef.stmanager.entities.ControlPlanilhasEntity;
import br.skytef.stmanager.entities.DivergenciaClienteEntity;
import br.skytef.stmanager.entities.ErroPlanilhaEntity;
import br.skytef.stmanager.entities.ProdutoClienteEntity;
import br.skytef.stmanager.entities.ProdutoEntity;
import br.skytef.stmanager.entities.SoftwareHouseEntity;
import br.skytef.stmanager.entities.UsuarioEntity;

public class ImportandoDados implements Runnable {

	private Timestamp dataAtual = new Data().DtTime();

	private String nomePlanilha;
	public String getNomePlanilha() {return nomePlanilha;}
	public void setNomePlanilha(String nomePlanilha) {this.nomePlanilha = nomePlanilha;}

	private ClienteEntity clienteBanco;
	private ClienteEntity clienteNovo;
	private SoftwareHouseEntity softwareBanco;
	private PlanCliente planilha;
	private PlanFinanceiro planilha2;
	private ControlPlanilhasEntity cp;
	private ClienteEntity parceiro;
	private ComercialClienteEntity comCliente;
	private SoftwareHouseEntity SHE;
	private ProdutoEntity produto;

	private UsuarioEntity usuario;
	public UsuarioEntity getUsuario() {return usuario;}
	public void setUsuario(UsuarioEntity usuarioEntity) {this.usuario = usuarioEntity;}

	private int LicenNumLoja = 0;
	private double totalFaturado = 0;

	

	public ImportandoDados() {
		super();
		try {
			FacesContext ctx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) ctx.getExternalContext().getSession(false);
			usuario = (UsuarioEntity)session.getAttribute("usuario");
			if(usuario == null){
				new LoginBean().encerraSessao();
			}
		}catch(SessionLoaderException e){ 
			new LoginBean().encerraSessao();
		}
	}
	@Override
	public void run() {
		if (planilha != null && planilha.validar()){
			iniciarControle(planilha);
			for(int i=1; i < planilha.qtlinha(); i++){
				planilha.importarlinha(i);
				produto = inserirAtualizarProduto();
				if(planilha.getCnpj() != 0)
					LicenNumLoja += planilha.getQtdLojas();
				clienteBanco = inserirAtualizarClientePlan1();
				if(clienteBanco != null){
					if (planilha.getComercial() != null){
						inserirAtualizarComercial();
					}
					if (planilha.getSoftwareHouse() != null) {
						SHE = new SoftwareHouseEntity(planilha.getSoftwareHouse(),clienteBanco.getIdCliente());
						softwareBanco  = new SoftwareHouseDao().buscarIdCliente(clienteBanco.getIdCliente()) ;
						if (softwareBanco == null ){
							new SoftwareHouseDao().inserir(SHE);
							softwareBanco  = new SoftwareHouseDao().buscarIdCliente(clienteBanco.getIdCliente()) ;
						}else if (!softwareBanco.getNome().equals(planilha.getSoftwareHouse())){ 
							new SoftwareHouseDao().alterar(SHE,clienteBanco.getIdCliente() );
						}
					}
					ProdutoClienteEntity prodCli = new ProdutoClienteDao().localizar(clienteBanco.getIdCliente(), produto.getId());
					if(prodCli == null){
						prodCli = new ProdutoClienteEntity();
						prodCli.setVpn_ativa(planilha.getVPNAtiva());
						prodCli.setArquivoLicenca(planilha.getArquivoLicenca());
						prodCli.setDataInclusao(dataAtual);
						prodCli.setTipoTarefa(planilha.getTipoTarefa());
						prodCli.setCliente_idCliente(clienteBanco.getIdCliente());
						prodCli.setProduto_id(produto.getId());
						new ProdutoClienteDao().inserir(prodCli);
					}
				}
			}
			cp.setLicencaNumLoja(LicenNumLoja);

		}else if (planilha2 != null && planilha2.validar()){
			iniciarControle(planilha2);
			for(int i=1; i < planilha2.qtlinha(); i++){
				try{
					planilha2.importarlinha(i);
					if(planilha2.getCnpj() != 0){
						totalFaturado += planilha2.getValorFaturado();
						clienteNovo = new ClienteDAO().buscarCliente(planilha2.getCnpj());
						if(clienteNovo == null){						
							clienteNovo = new ClienteEntity();
							clienteNovo.setRazaoSocial(planilha2.getRazaoSocial());
							clienteNovo.setNomeFantasia(planilha2.getNomeFantasia());
							clienteNovo.setCnpj(planilha2.getCnpj());
							clienteNovo.setQtdLojas(planilha2.getQtdLojas());
							clienteNovo.setValorFaturado(planilha2.getValorFaturado());
							clienteNovo.setUsuario_id(usuario.getId());
							parceiro = new ClienteDAO().buscarCliente(planilha2.getParceiro());
							int id  = (int) clienteNovo.getCnpj();
							if(id < 0)
								id *= -1;
							clienteNovo.setIdCliente(id);
							if(parceiro != null)
								clienteNovo.setIdParceiro(parceiro.getIdCliente());
							new ClienteDAO().inserir(clienteNovo);
							divergencia(nomePlanilha, 0, clienteNovo.getIdCliente(), "faturamento");
						}else{
							clienteNovo.setUsuario_id(usuario.getId());
							double valorSomado = clienteNovo.getValorFaturado();
							valorSomado += planilha2.getValorFaturado();
							clienteNovo.setValorFaturado(valorSomado);
							parceiro = new ClienteDAO().buscarCliente(planilha2.getParceiro());
							if(parceiro != null)
								clienteNovo.setIdParceiro(parceiro.getIdCliente());
							if(clienteNovo.getQtdLojas() != planilha2.getQtdLojas()){
								divergencia(nomePlanilha, planilha2.getQtdLojas(), clienteNovo.getIdCliente(), "divgLoja");
							}
							if(clienteNovo.getValorFaturado() <= 0 ){
								divergencia(nomePlanilha, planilha2.getValorFaturado(), clienteNovo.getIdCliente(), "divgValor");
							}
							new ClienteDAO().alterar(clienteNovo);
						}

					}else{
						inserirErro(planilha2);
					}

				} catch (SQLException e) {
					inserirErro(planilha2);
				}
			}
			cp.setTotalFaturado(totalFaturado);
		}
		encerrarControle();
	}
	private ComercialEntity inserirAtualizarComercial() {
		ComercialEntity comercial = null;
		if(clienteBanco !=null){
			do{
				comercial = new ComercialDAO().buscar(planilha.getComercial());
				if(comercial != null){
					comCliente = new ComercialClienteDAO().buscar(clienteBanco.getIdCliente(), comercial.getId());
					if(comCliente == null){
						comCliente = new ComercialClienteEntity(clienteBanco.getIdCliente(), comercial.getId());
						new ComercialClienteDAO().inserir(comCliente);
					}
				}else{
					comercial = new ComercialEntity(planilha.getComercial(), null, null, null,0);
					new ComercialDAO().inserir(comercial);
				}
			}while(comercial.getId() <= 0);
		}
		return comercial;
	}
	private ClienteEntity inserirAtualizarClientePlan1(){
		ClienteEntity cliente;
		try {
			cliente = new ClienteDAO().buscarCliente(planilha.getCnpj());
			if(cliente == null && planilha.getCnpj() != 0){			
				cliente = new ClienteEntity();
				cliente.setRazaoSocial(planilha.getRazaoSocial()); 
				cliente.setNomeFantasia(planilha.getNomeFantasia()); 
				cliente.setCnpj(planilha.getCnpj()); 
				cliente.setQtdLojas(planilha.getQtdLojas()); 
				cliente.setMovimentacao(planilha.getMovimentacao());
				cliente.setDataMovimentacao(planilha.getDataMovimentacao()); 
				cliente.setResponsavel(planilha.getResponsavel()); 
				cliente.setResponsavelEmail(planilha.getResponsavelEmail()); 
				cliente.setAtendSuporte(planilha.getAtendSuporte()); 
				cliente.setTelefone(planilha.getTelefone()); 
				cliente.setEmailCliente(planilha.getEmailCliente()); 
				cliente.setData_inclusao(dataAtual);
				cliente.setUsuario_id(usuario.getId());
				parceiro = new ClienteDAO().buscarCliente(planilha.getParceiro());
				int id  = (int) cliente.getCnpj();
				if(id < 0)
					id *= -1;
				cliente.setIdCliente(id);
				if(parceiro != null)
					cliente.setIdParceiro(parceiro.getIdCliente());
				new ClienteDAO().inserir(cliente);					
			}else if (planilha.getCnpj() != 0){
				cliente.setRazaoSocial(planilha.getRazaoSocial()); 
				cliente.setNomeFantasia(planilha.getNomeFantasia()); 
				cliente.setCnpj(planilha.getCnpj()); 
				cliente.setQtdLojas(planilha.getQtdLojas()); 
				cliente.setMovimentacao(planilha.getMovimentacao());
				cliente.setDataMovimentacao(planilha.getDataMovimentacao()); 
				cliente.setResponsavel(planilha.getResponsavel()); 
				cliente.setResponsavelEmail(planilha.getResponsavelEmail()); 
				cliente.setAtendSuporte(planilha.getAtendSuporte()); 
				cliente.setTelefone(planilha.getTelefone()); 
				cliente.setEmailCliente(planilha.getEmailCliente()); 
				cliente.setData_atualizacao(dataAtual);
				cliente.setUsuario_id(usuario.getId());
				parceiro = new ClienteDAO().buscarCliente(planilha.getParceiro());
				if(parceiro != null)
					cliente.setIdParceiro(parceiro.getIdCliente());
				new ClienteDAO().alterar(cliente);
			}
			return cliente;
		}catch (Exception e) {
			inserirErro(planilha);
			System.out.println(" Inseri erro na insersão: "+e);
			return null;
		}

	}

	private ProdutoEntity inserirAtualizarProduto(){
		ProdutoEntity prod;
		do{			
			prod = new ProdutoDao().buscar(planilha.getProduto());
			if(prod == null){
				prod = new ProdutoEntity();
				prod.setNome(planilha.getProduto());
				new ProdutoDao().inserir(prod);
			}
		}while(prod.getId() <= 0);
		return prod;
	}


	private void divergencia(String plan, double valor, int cliente, String tipo){
		DivergenciaClienteEntity DCE;
		new DivergenciaClienteDao().excluir(cliente);
		DCE = new DivergenciaClienteEntity(plan, valor, tipo, new Data().DtTime(), cliente);
		new DivergenciaClienteDao().inserir(DCE);
	}

	private void inserirErro(PlanCliente plan){
		cp.setErros(cp.getErros() + 1);
		cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
		if (cp != null){
			new ControlPlanilhaDAO().inserirAtualizar(cp);
			new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(1, plan.getLinhaErrada()));
		}
	}

	private void inserirErro(PlanFinanceiro plan){
		cp.setErros(cp.getErros() + 1);
		cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
		if (cp != null){
			new ControlPlanilhaDAO().inserirAtualizar(cp);
			new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(2, plan.getLinhaErrada()));
		}
	}

	private void iniciarControle(PlanCliente plan){
		try {
			cp = new ControlPlanilhasEntity(1,nomePlanilha, plan.qtlinha()-1, 0, dataAtual,0,0.0,0.0,0.0,0.0);
			new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void iniciarControle(PlanFinanceiro plan){
		try {
			cp = new ControlPlanilhasEntity(2,nomePlanilha, plan.qtlinha()-1, 0, dataAtual,0,0.0,0.0,0.0,0.0);
			new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
			new ClienteDAO().limparValorFaturado();
			new DivergenciaClienteDao().limpar(nomePlanilha);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private void encerrarControle(){
		new ControlPlanilhaDAO().inserirAtualizar(cp);
	}

	public PlanCliente getPlanilha() {return planilha;}
	public void setPlanilha(PlanCliente planilha) {this.planilha = planilha;}

	public PlanFinanceiro getPlanilha2() {return planilha2;}
	public void setPlanilha2(PlanFinanceiro planilha2) {this.planilha2 = planilha2;}

}